package com.demo.webapp.action.root;

import java.util.List;

import org.apache.commons.lang.StringUtils;
import org.springframework.context.i18n.LocaleContextHolder;

import com.demo.common.Utils;
import com.demo.core.model.Config;
import com.demo.core.model.ConfigItem;
import com.demo.core.service.base.ConfigItemService;
import com.demo.core.service.base.ConfigService;
import com.demo.security.annotation.function.Function;
import com.demo.webapp.action.PageAction;
import com.demo.webapp.context.MultisiteContextHolder;

/**
 * 配置管理Action
 * @author ryuu.kk
 *
 */
public class ConfigAction extends PageAction {

	/**
	 * 序列化ID
	 */
	private static final long serialVersionUID = -6755929548950281354L;

	/**
	 * 主键ID
	 * 注意:该字段可能为Config和ConfigItem的主键
	 */
	private Long id;
	
	/**
	 * 站点ID
	 */
	private Long siteId;
	
	/**
	 * 配置类型
	 */
	private String type;
	
	/**
	 * 配置模型
	 */
	private Config config;
	
	/**
	 * 配置项目
	 */
	private ConfigItem configItem;
	
	/**
	 * 配置模型列表
	 */
	private List<Config> configList;
	
	/**
	 * 内置配置列表
	 */
	private List<Config> inlayConfigList;
	
	/**
	 * 站点配置
	 */
	private List<Config> siteConfigList;
	
	/**
	 * 用户自定义配置
	 */
	private List<Config> customConfigList;
	
	/**
	 * 配置服务
	 */
	private ConfigService configService;

	/**
	 * 配置项目服务
	 */
	private ConfigItemService configItemService;
	
	/**
	 * 配置模型
	 */
	public String execute() {
		
		return SUCCESS;
	}
	
	/**
	 * 配置列表
	 * @return String
	 */
	public String list() {

		this.siteId = getSite().getId();
		//~ 不区分内置配置与站点配置,但展示层时,不能删除内置类型配置
		//configService.findAll(siteId, i18n)
		// 站点内置配置信息Config.CONFIG_TYPE_SITEx
		//this.siteConfigList = configService.queryList(siteId, Config.CONFIG_TYPE_SITE, null);
		// 系统内置配置信息
		//this.inlayConfigList = configService.queryList(siteId, Config.CONFIG_TYPE_INLAY, true);
		this.siteConfigList = configService.queryAll(siteId);
		
		return SUCCESS;
	}
	
	/**
	 * 创建一个站点配置
	 * @return String
	 */
	@Function(id = 100920, pid = 100900, code = "manage.config.create")
	public String create() {
		return SUCCESS;
	}
	
	/**
	 * 配置保存
	 * @return String
	 */
	public String save() {
		
		this.siteId = MultisiteContextHolder.getSite().getId();
		
		config.setSiteId(siteId);
		// 站点配置
		config.setType(Config.CONFIG_TYPE_SITE);
		// 配置状态:正常状态
		config.setStatus(Config.STATUS_NORMAL);
		// 配置语言
		String i18n = config.getI18n();
		if (StringUtils.isBlank(i18n)) {
			config.setI18n(LocaleContextHolder.getLocale().toString());
		}
		// 增加配置项目
		id = configService.save(config);
		// 增加配置子项目
		if (config.getConfigItemList() != null) {
			for (ConfigItem item : config.getConfigItemList()) {
				item.setI18n(config.getI18n());
				item.setConfigId(id);
				if (StringUtils.isBlank(item.getKey())) {
					item.setKey(Utils.uuid());
				}
				configItemService.save(item);
			}
		}
		addActionMessage("配置数据保存成功.");
		return CALLBACK;
	}
	
	/**
	 * 配置编辑
	 * @return String
	 */
	public String edit() {
		//this.configItem;
		this.config = configService.query(id);
		return SUCCESS;
	}
	
	/**
	 * 配置更新
	 * @return String
	 */
	public String update() {
		//this.configItem;
		
		Config configTemp = configService.find(id);
		if (configTemp != null) {
			configItemService.deleteItems(id);
			configService.update(id, config.getTitle(), config.getValue());
			configService.updateStatus(id, config.isEnabled(), Config.STATUS_NORMAL);
			if (config.getConfigItemList() != null) {
				for (ConfigItem item : config.getConfigItemList()) {
					item.setI18n(configTemp.getI18n());
					item.setConfigId(id);
					if (StringUtils.isBlank(item.getKey())) {
						//item.setKey(Utils.uuid());
					}
					configItemService.save(item);
				}
			}
		}
		addActionMessage("配置数据更新成功.");
		return CALLBACK;
	}
	
	/**
	 * 配置状态更新
	 * @return String
	 */
	public String enabled() {
		//this.configItem;
		configItemService.updateStatus(id, configItem.isEnabled(), configItem.getStatus());
		return SUCCESS;
	}
	
	/**
	 * 删除配置(包括配置子项)
	 * @return String
	 */
	public String delete() {
		
		//config.setType(Config.CONFIG_TYPE_SITE);
		configService.delete(null, id);
		addActionMessage("配置数据删除成功.");
		return CALLBACK;
	}
	
	/**
	 * 删除配置子项
	 * @return String
	 */
	public String deleteItem() {
		addActionMessage("配置子项目数据删除成功.");
		configItemService.delete(id);
		return CALLBACK;
	}
	
	/**
	 * 内置配置一览
	 * 内置配置将只能进行查看
	 * @return String
	 */
	public String inlay() {
		
		this.siteId = MultisiteContextHolder.getSite().getId();
		//configService.findAll(siteId, i18n)
		// 内置站点配置信息
		this.inlayConfigList = configService.queryList(siteId, Config.CONFIG_TYPE_INLAY);
		return SUCCESS;
	}
	
	/**
	 * 用户自定义的配置
	 * 有用户管理的配置信息(个人使用)
	 * @return String
	 */
	public String custom() {
		this.siteId = MultisiteContextHolder.getSite().getId();
		//configService.findAll(siteId, i18n)
		// 用户内置配置信息
		this.customConfigList = configService.queryList(siteId, Config.CONFIG_TYPE_USER);
		
		return SUCCESS;
	}
	
	/**
	 * 站点自定义配置
	 * 由系统管理员管理本站点的配置信息
	 * @return String
	 */
	public String site() {
		
		this.siteId = MultisiteContextHolder.getSite().getId();
		//configService.findAll(siteId, i18n)
		// 站点内置配置信息
		this.siteConfigList = configService.queryList(siteId, Config.CONFIG_TYPE_SITE, null);
		return SUCCESS;
	}
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public Config getConfig() {
		return config;
	}

	public void setConfig(Config config) {
		this.config = config;
	}

	public Long getSiteId() {
		return siteId;
	}

	public List<Config> getConfigList() {
		return configList;
	}

	public void setConfigService(ConfigService configService) {
		this.configService = configService;
	}

	public List<Config> getInlayConfigList() {
		return inlayConfigList;
	}

	public List<Config> getSiteConfigList() {
		return siteConfigList;
	}

	public String getType() {
		return type;
	}

	public void setType(String type) {
		this.type = type;
	}

	public ConfigItem getConfigItem() {
		return configItem;
	}

	public void setConfigItem(ConfigItem configItem) {
		this.configItem = configItem;
	}

	public List<Config> getCustomConfigList() {
		return customConfigList;
	}

	public void setConfigItemService(ConfigItemService configItemService) {
		this.configItemService = configItemService;
	}
}
